<?php
$mode=php_sapi_name();
if($mode!='cli'){
	echo "<style>._kuang_{border: 1px solid red; border-radius: 6px; padding: 6px; margin: 6px; line-height: 1.5; text-align: left;}</style>\n";
}
function log2(...$msg){//log是对数函数，是已定义的函数，不能重名
//	p($msg);die();
	\core\lib\Log::log2(...$msg);
}
function p(mixed ...$a) {
	if(!$a)return;
	global $mode;
	if($mode!='cli')echo "<pre class='_kuang_'>";
	$x=0;
	foreach ($a as $i) {
		echo sprintf("%3s] ",'['.++$x),preg_replace('@(\r?\n)@',"$1     ", to_string($i,showBracket:false)), "\n";
	}
	echo $mode!='cli'?'</pre>':"\n";
}
/**
 * @param $value 要显示的数据
 * @param bool $withKey 对数组来说是否显示键值
 * @param string $delimiter 要显示在一行，请设置为 ""
 * @param bool $showBracket 多行显示时是否显示 [], 对单行显示无效
 * @return string 美化后的数据字符串
 */
function to_string(mixed $value, bool $withKey = true, string $delimiter = "\n", bool $showBracket=true): string {
	if (is_null($value)) return "NULL";
	if (is_bool($value)) return $value ? 'true' : 'false';
	if (is_int($value)) return $value;
	if (is_float($value)) return float_to_string($value);
	if (is_string($value)) return '"' . $value . '"';
	if (is_array($value)) return array_to_string($value, $withKey, $delimiter,$showBracket);
	if (is_object($value)) return json_encode($value);
	return "Unknow";
}
/**
 * @param float $value 要转换为字符串的浮点数
 * @return string 转换后的字符串
 */
function float_to_string(float $value): string {
	if (is_nan($value)) return 'NAN';
	if ($value == (int)$value) return $value . '.0';
	return $value;
}
/**
 * @param array $value 要转换为字符串的数组
 * @param bool $withKey 是否显示数组的键值
 * @param string $delimiter 要显示在一行，请设置为 ""
 * @param bool $showBracket 多行显示时是否显示 [], 对单行显示无效
 * @param int $levels 递归显示数组时用于控制缩进
 * @return string 转换后的字符串
 */
function array_to_string(array $value, bool $withKey = false, string $delimiter = "\n", bool $showBracket=false, int $levels = 0) {
	if (empty($value)) return $showBracket?'[]':'Array(0):';
	$tmp = $padding = $paddingKeyValue = '';
	if ($delimiter) {
		for ($i = 0; $i < $levels; ++$i) $padding .= ($showBracket?' ':'|').'   ';
		$paddingKeyValue = $padding . ($showBracket?' ':'|').'   ';
		$paddingKeyValue[0]=' ';
	}else{
		$showBracket=true;//不换行，就一定显示 []
	}
	++$levels;
	foreach ($value as $k => $v) {
		$tmp .= $paddingKeyValue
			. ($withKey ? to_string($k) . ' => ' : '')
			. (is_array($v)
				? array_to_string($v, $withKey, $delimiter, $showBracket, $levels)
				: to_string($v, $withKey))
			. ', '
			. ($delimiter ?: '');
	}
	return ($delimiter!="\n"?'[':'Array(' . count($value) . ')'.($showBracket?'[':':')) . ($delimiter ?: '')
		. substr($tmp, 0, -strlen($delimiter) - 2)
		.($showBracket?($delimiter ?: ''). $padding . ']':'');
}

function table(PDOStatement $ps) {
	$cc=$ps->columnCount();//获取结果集列的个数
	if($cc===0)return;//如果是0，说明结果集上不存在
	echo "<table border='1' cellspacing='0' cellpadding='6'><tr>";
	for ($i = 0; $i < $cc; ++$i) {//循环显示表头信息
		echo '<th>', $ps->getColumnMeta($i)['name'], '</th>';
	}
	echo "</tr>";
	foreach ($ps as $r) {//循环显示记录内容
		echo '<tr>';
		for ($i = 0; $i < $cc; ++$i) { //事先并不知道是按列号还是按列名才能取到数据
			echo '<td>', $r[$i]??$r[$ps->getColumnMeta($i)['name']], '</td>'; //列号取不到数据就用列名
		}
		echo '</tr>';
	}
	echo "</table>";
}
//p(12345,'Hello',['name'=>'张三', 'friends'=>['李四',['name'=>'王五','age'=>18]],'school'=>'水院'], true, null);

